DRAW_CHAR_RA .CONST x5000
MY_R0 .CONST x5001
MY_R1 .CONST x5002
MY_R2 .CONST x5003
MY_R3 .CONST x5004
ASCII_TAB .UCONST x4000
VRAM_START_ADDR .UCONST xC000
        
;;; Video display is 128x124 pixels
VRAM_ROW_SIZE_PIXELS .UCONST #128
VRAM_ROW_SIZE_CHAR_PIXELS .UCONST #1024

COLOR .UCONST x03E0     ; 0 00000 11111 00000 green

.CODE
.ADDR x0000

PROGRAM_START
        NOP                     ; TODO: fill in your code here

        ;; R0 row to draw to
        ;; R1 column to draw to
        ;; R2 ASCII character to draw
        ;; Note: DRAW_CHAR and its callees overwrite all registers.
        ;; Callers must save any register(s) needed across this call.
.FALIGN
DRAW_CHAR
        LC R5, DRAW_CHAR_RA     ; save caller's return address
        STR R7, R5, #0

        LC R3, VRAM_ROW_SIZE_CHAR_PIXELS
        MUL R0, R0, R3
        SLL R1, R1, #3          ; *8
        ADD R0, R0, R1
        LC R1, VRAM_START_ADDR
        ADD R0, R0, R1          ; R0 is address to draw to
        SLL R2, R2, #3
        LC R1, ASCII_TAB
        ADD R1, R1, R2          ; R1 is address of character's pixel data
        
        CONST R2, #0
DC_LOOP
        ADD R3, R0, R2
        LDR R4, R1, #0 
        JSR DRAW_PIXEL_TO_COLUMN ; needs to preserve R0, R1, R2 
        ADD R2, R2, #1
        ADD R1, R1, #1
        ADD R5, R2, #-8
        BRnz DC_LOOP

        LC R5, DRAW_CHAR_RA      ; restore caller's return address
        LDR R7, R5, #0
        RET

        ;; R3 address to start drawing to
        ;; R4 pixel values to draw to this column
.FALIGN
DRAW_PIXEL_TO_COLUMN
        CONST R5, #0
DPTC_LOOP
        CONST R6, #1
        AND R6, R4, R6
        BRz DPTC_SKIPDRAW
        LC R6, COLOR
        STR R6, R3, #0
DPTC_SKIPDRAW
        SRL R4, R4, #1
        LC R6, VRAM_ROW_SIZE_PIXELS
        ADD R3, R3, R6
        ADD R5, R5 #1
        ADD R6, R5, #-8
        BRnz DPTC_LOOP
        RET


;;; data to map from an ASCII character to an 8x8 pixel representation. 
;;; Each .FILL stores 1 byte which represents a column of pixels (1 bit 
;;; per row), and each character's bitmap is recorded in 8 consecutive 
;;; bytes (columns).
;;; From https://github.com/mmattioli/ZedBoard-OLED/blob/master/rtl/ascii_rom.vhd
.DATA
.ADDR x4000
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x5f
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x03
.FILL x00
.FILL x03
.FILL x00
.FILL x00
.FILL x00
.FILL x64
.FILL x3c
.FILL x26
.FILL x64
.FILL x3c
.FILL x26
.FILL x24
.FILL x00
.FILL x26
.FILL x49
.FILL x49
.FILL x7f
.FILL x49
.FILL x49
.FILL x32
.FILL x00
.FILL x42
.FILL x25
.FILL x12
.FILL x08
.FILL x24
.FILL x52
.FILL x21
.FILL x00
.FILL x20
.FILL x50
.FILL x4e
.FILL x55
.FILL x22
.FILL x58
.FILL x28
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x03
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x1c
.FILL x22
.FILL x41
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x41
.FILL x22
.FILL x1c
.FILL x00
.FILL x00
.FILL x00
.FILL x15
.FILL x15
.FILL x0e
.FILL x0e
.FILL x15
.FILL x15
.FILL x00
.FILL x00
.FILL x08
.FILL x08
.FILL x3e
.FILL x08
.FILL x08
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x50
.FILL x30
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x08
.FILL x08
.FILL x08
.FILL x08
.FILL x08
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x40
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x40
.FILL x20
.FILL x10
.FILL x08
.FILL x04
.FILL x02
.FILL x01
.FILL x00
.FILL x00
.FILL x3e
.FILL x41
.FILL x41
.FILL x41
.FILL x3e
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x41
.FILL x7f
.FILL x40
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x42
.FILL x61
.FILL x51
.FILL x49
.FILL x6e
.FILL x00
.FILL x00
.FILL x00
.FILL x22
.FILL x41
.FILL x49
.FILL x49
.FILL x36
.FILL x00
.FILL x00
.FILL x00
.FILL x18
.FILL x14
.FILL x12
.FILL x7f
.FILL x10
.FILL x00
.FILL x00
.FILL x00
.FILL x27
.FILL x49
.FILL x49
.FILL x49
.FILL x71
.FILL x00
.FILL x00
.FILL x00
.FILL x3c
.FILL x4a
.FILL x49
.FILL x48
.FILL x70
.FILL x00
.FILL x00
.FILL x00
.FILL x43
.FILL x21
.FILL x11
.FILL x0d
.FILL x03
.FILL x00
.FILL x00
.FILL x00
.FILL x36
.FILL x49
.FILL x49
.FILL x49
.FILL x36
.FILL x00
.FILL x00
.FILL x00
.FILL x06
.FILL x09
.FILL x49
.FILL x29
.FILL x1e
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x12
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x52
.FILL x30
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x08
.FILL x14
.FILL x14
.FILL x22
.FILL x00
.FILL x00
.FILL x00
.FILL x14
.FILL x14
.FILL x14
.FILL x14
.FILL x14
.FILL x14
.FILL x00
.FILL x00
.FILL x00
.FILL x22
.FILL x14
.FILL x14
.FILL x08
.FILL x00
.FILL x00
.FILL x00
.FILL x02
.FILL x01
.FILL x59
.FILL x05
.FILL x02
.FILL x00
.FILL x00
.FILL x3e
.FILL x41
.FILL x5d
.FILL x55
.FILL x4d
.FILL x51
.FILL x2e
.FILL x00
.FILL x40
.FILL x7c
.FILL x4a
.FILL x09
.FILL x4a
.FILL x7c
.FILL x40
.FILL x00
.FILL x41
.FILL x7f
.FILL x49
.FILL x49
.FILL x49
.FILL x49
.FILL x36
.FILL x00
.FILL x1c
.FILL x22
.FILL x41
.FILL x41
.FILL x41
.FILL x41
.FILL x22
.FILL x00
.FILL x41
.FILL x7f
.FILL x41
.FILL x41
.FILL x41
.FILL x22
.FILL x1c
.FILL x00
.FILL x41
.FILL x7f
.FILL x49
.FILL x49
.FILL x5d
.FILL x41
.FILL x63
.FILL x00
.FILL x41
.FILL x7f
.FILL x49
.FILL x09
.FILL x1d
.FILL x01
.FILL x03
.FILL x00
.FILL x1c
.FILL x22
.FILL x41
.FILL x49
.FILL x49
.FILL x3a
.FILL x08
.FILL x00
.FILL x41
.FILL x7f
.FILL x08
.FILL x08
.FILL x08
.FILL x7f
.FILL x41
.FILL x00
.FILL x00
.FILL x41
.FILL x41
.FILL x7F
.FILL x41
.FILL x41
.FILL x00
.FILL x00
.FILL x30
.FILL x40
.FILL x41
.FILL x41
.FILL x3F
.FILL x01
.FILL x01
.FILL x00
.FILL x41
.FILL x7f
.FILL x08
.FILL x0c
.FILL x12
.FILL x61
.FILL x41
.FILL x00
.FILL x41
.FILL x7f
.FILL x41
.FILL x40
.FILL x40
.FILL x40
.FILL x60
.FILL x00
.FILL x41
.FILL x7f
.FILL x42
.FILL x0c
.FILL x42
.FILL x7f
.FILL x41
.FILL x00
.FILL x41
.FILL x7f
.FILL x42
.FILL x0c
.FILL x11
.FILL x7f
.FILL x01
.FILL x00
.FILL x1c
.FILL x22
.FILL x41
.FILL x41
.FILL x41
.FILL x22
.FILL x1c
.FILL x00
.FILL x41
.FILL x7f
.FILL x49
.FILL x09
.FILL x09
.FILL x09
.FILL x06
.FILL x00
.FILL x0c
.FILL x12
.FILL x21
.FILL x21
.FILL x61
.FILL x52
.FILL x4c
.FILL x00
.FILL x41
.FILL x7f
.FILL x09
.FILL x09
.FILL x19
.FILL x69
.FILL x46
.FILL x00
.FILL x66
.FILL x49
.FILL x49
.FILL x49
.FILL x49
.FILL x49
.FILL x33
.FILL x00
.FILL x03
.FILL x01
.FILL x41
.FILL x7f
.FILL x41
.FILL x01
.FILL x03
.FILL x00
.FILL x01
.FILL x3f
.FILL x41
.FILL x40
.FILL x41
.FILL x3f
.FILL x01
.FILL x00
.FILL x01
.FILL x0f
.FILL x31
.FILL x40
.FILL x31
.FILL x0f
.FILL x01
.FILL x00
.FILL x01
.FILL x1f
.FILL x61
.FILL x14
.FILL x61
.FILL x1f
.FILL x01
.FILL x00
.FILL x41
.FILL x41
.FILL x36
.FILL x08
.FILL x36
.FILL x41
.FILL x41
.FILL x00
.FILL x01
.FILL x03
.FILL x44
.FILL x78
.FILL x44
.FILL x03
.FILL x01
.FILL x00
.FILL x43
.FILL x61
.FILL x51
.FILL x49
.FILL x45
.FILL x43
.FILL x61
.FILL x00
.FILL x00
.FILL x00
.FILL x7f
.FILL x41
.FILL x41
.FILL x00
.FILL x00
.FILL x00
.FILL x01
.FILL x02
.FILL x04
.FILL x08
.FILL x10
.FILL x20
.FILL x40
.FILL x00
.FILL x00
.FILL x00
.FILL x41
.FILL x41
.FILL x7f
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x04
.FILL x02
.FILL x01
.FILL x01
.FILL x02
.FILL x04
.FILL x00
.FILL x00
.FILL x40
.FILL x40
.FILL x40
.FILL x40
.FILL x40
.FILL x40
.FILL x00
.FILL x00
.FILL x01
.FILL x02
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x34
.FILL x4a
.FILL x4a
.FILL x4a
.FILL x3c
.FILL x40
.FILL x00
.FILL x00
.FILL x41
.FILL x3f
.FILL x48
.FILL x48
.FILL x48
.FILL x30
.FILL x00
.FILL x00
.FILL x3c
.FILL x42
.FILL x42
.FILL x42
.FILL x24
.FILL x00
.FILL x00
.FILL x00
.FILL x30
.FILL x48
.FILL x48
.FILL x49
.FILL x3f
.FILL x40
.FILL x00
.FILL x00
.FILL x3c
.FILL x4a
.FILL x4a
.FILL x4a
.FILL x2c
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x48
.FILL x7e
.FILL x49
.FILL x09
.FILL x00
.FILL x00
.FILL x00
.FILL x26
.FILL x49
.FILL x49
.FILL x49
.FILL x3f
.FILL x01
.FILL x00
.FILL x41
.FILL x7f
.FILL x48
.FILL x04
.FILL x44
.FILL x78
.FILL x40
.FILL x00
.FILL x00
.FILL x00
.FILL x44
.FILL x7d
.FILL x40
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x40
.FILL x44
.FILL x3d
.FILL x00
.FILL x00
.FILL x00
.FILL x41
.FILL x7f
.FILL x10
.FILL x18
.FILL x24
.FILL x42
.FILL x42
.FILL x00
.FILL x00
.FILL x40
.FILL x41
.FILL x7f
.FILL x40
.FILL x40
.FILL x00
.FILL x00
.FILL x42
.FILL x7e
.FILL x02
.FILL x7c
.FILL x02
.FILL x7e
.FILL x40
.FILL x00
.FILL x42
.FILL x7e
.FILL x44
.FILL x02
.FILL x42
.FILL x7c
.FILL x40
.FILL x00
.FILL x00
.FILL x3c
.FILL x42
.FILL x42
.FILL x42
.FILL x3c
.FILL x00
.FILL x00
.FILL x00
.FILL x41
.FILL x7f
.FILL x49
.FILL x09
.FILL x09
.FILL x06
.FILL x00
.FILL x00
.FILL x06
.FILL x09
.FILL x09
.FILL x49
.FILL x7f
.FILL x41
.FILL x00
.FILL x00
.FILL x42
.FILL x7e
.FILL x44
.FILL x02
.FILL x02
.FILL x04
.FILL x00
.FILL x00
.FILL x64
.FILL x4a
.FILL x4a
.FILL x4a
.FILL x36
.FILL x00
.FILL x00
.FILL x00
.FILL x04
.FILL x3f
.FILL x44
.FILL x44
.FILL x20
.FILL x00
.FILL x00
.FILL x00
.FILL x02
.FILL x3e
.FILL x40
.FILL x40
.FILL x22
.FILL x7e
.FILL x40
.FILL x02
.FILL x0e
.FILL x32
.FILL x40
.FILL x32
.FILL x0e
.FILL x02
.FILL x00
.FILL x02
.FILL x1e
.FILL x62
.FILL x18
.FILL x62
.FILL x1e
.FILL x02
.FILL x00
.FILL x42
.FILL x62
.FILL x14
.FILL x08
.FILL x14
.FILL x62
.FILL x42
.FILL x00
.FILL x01
.FILL x43
.FILL x45
.FILL x38
.FILL x05
.FILL x03
.FILL x01
.FILL x00
.FILL x00
.FILL x46
.FILL x62
.FILL x52
.FILL x4a
.FILL x46
.FILL x62
.FILL x00
.FILL x00
.FILL x00
.FILL x08
.FILL x36
.FILL x41
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x7f
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x00
.FILL x41
.FILL x36
.FILL x08
.FILL x00
.FILL x00
.FILL x00
.FILL x18
.FILL x08
.FILL x08
.FILL x10
.FILL x10
.FILL x18
.FILL x00
.FILL xAA
.FILL x55
.FILL xAA
.FILL x55
.FILL xAA
.FILL x55
.FILL xAA
.FILL x55

        ;; scratch space
.ADDR x5000
.BLKW 16

        ;; Minimal OS code - jump straight to the code at 0x0000
        .OS
        .CODE
        .ADDR x8200
        CONST R1, #0
        JMPR R1
